﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data;
using System.Data.SqlClient;

namespace capaNegocios
{
    public class clsHorario
    {
        public String id { get; set; } 
        public String nombre { get; set; }
        public String horaInicio { get; set; }
        public String horaFinal { get; set; }
        public String dia { get; set; }   
        public char estado { get; set; }
        
        public bool Agregar(String _idCurso, String _anio, String _grado, String _seccion)
        {
            clsConexion oClsConexion = new clsConexion();
            SqlConnection objConexion = new SqlConnection();
            SqlCommand objComando = new SqlCommand();

            estado = 'A';

            try
            {
                objConexion = oClsConexion.AbrirConexion();

                objComando.CommandType = CommandType.StoredProcedure;
                objComando.CommandText = "USP_I_AGREGARHORARIO";

                objComando.Parameters.Add(new SqlParameter("@NOMBRES", SqlDbType.VarChar));
                objComando.Parameters.Add(new SqlParameter("@HORAINICIO", SqlDbType.Char));
                objComando.Parameters.Add(new SqlParameter("@HORAFINAL", SqlDbType.Char));
                objComando.Parameters.Add(new SqlParameter("@DIA", SqlDbType.VarChar));
                objComando.Parameters.Add(new SqlParameter("@ESTADO", SqlDbType.Char));
                objComando.Parameters.Add(new SqlParameter("@CURSO", SqlDbType.Char));
                objComando.Parameters.Add(new SqlParameter("@GRADO", SqlDbType.Char));
                objComando.Parameters.Add(new SqlParameter("@ANIO", SqlDbType.VarChar));
                objComando.Parameters.Add(new SqlParameter("@SECCION", SqlDbType.Char));                    

                objComando.Parameters["@NOMBRES"].Value = this.nombre;
                objComando.Parameters["@HORAINICIO"].Value = this.horaInicio;
                objComando.Parameters["@HORAFINAL"].Value = this.horaFinal;
                objComando.Parameters["@DIA"].Value = this.dia;
                objComando.Parameters["@ESTADO"].Value = this.estado;
                objComando.Parameters["@CURSO"].Value = _idCurso;
                objComando.Parameters["@GRADO"].Value = _grado;
                objComando.Parameters["@ANIO"].Value = _anio;
                objComando.Parameters["@SECCION"].Value = _seccion;
                
                objComando.Connection = objConexion;
                objComando.ExecuteNonQuery();

                return true;
            }
            catch (Exception ex)
            {
                return false;
                throw ex;
            }
            finally
            {
                objConexion.Close();
            }
        }

        public bool Actualizar(String _idCurso, String _idAnioAcademico)
        {
            clsConexion oClsConexion = new clsConexion();
            SqlConnection objConexion = new SqlConnection();
            SqlCommand objComando = new SqlCommand();

            try
            {
                objConexion = oClsConexion.AbrirConexion();

                objComando.CommandType = CommandType.StoredProcedure;
                objComando.CommandText = "USP_U_MODIFICARHORARIO";

                objComando.Parameters.Add(new SqlParameter("@ID", SqlDbType.Char));
                objComando.Parameters.Add(new SqlParameter("@NOMBRES", SqlDbType.VarChar));
                objComando.Parameters.Add(new SqlParameter("@HORAINICIO", SqlDbType.Char));
                objComando.Parameters.Add(new SqlParameter("@HORAFINAL", SqlDbType.Char));
                objComando.Parameters.Add(new SqlParameter("@DIA", SqlDbType.VarChar));
                objComando.Parameters.Add(new SqlParameter("@ESTADO", SqlDbType.Char));
                objComando.Parameters.Add(new SqlParameter("@CURSO", SqlDbType.Char));
                objComando.Parameters.Add(new SqlParameter("@ANIOACADEMICO", SqlDbType.Char));

                objComando.Parameters["@ID"].Value = this.id;
                objComando.Parameters["@NOMBRES"].Value = this.nombre;
                objComando.Parameters["@HORAINICIO"].Value = this.horaInicio;
                objComando.Parameters["@HORAFINAL"].Value = this.horaFinal;
                objComando.Parameters["@DIA"].Value = this.dia;
                objComando.Parameters["@ESTADO"].Value = this.estado;
                objComando.Parameters["@CURSO"].Value = _idCurso;
                objComando.Parameters["@ANIOACADEMICO"].Value = _idAnioAcademico;

                objComando.Connection = objConexion;
                objComando.ExecuteNonQuery();

                return true;
            }
            catch (Exception ex)
            {
                return false;
                throw ex;
            }
            finally
            {
                objConexion.Close();
            }
        }

        public DataTable Buscar(String _grado, String _anio, String _seccion)
        {
            clsConexion oClsConexion = new clsConexion();
            SqlConnection objConexion = new SqlConnection();
            SqlCommand objComando = new SqlCommand();

            try
            {               
                SqlDataAdapter objDataAdapter = new SqlDataAdapter();
                DataTable objDataTable = new DataTable();

                objConexion = oClsConexion.AbrirConexion();

                objComando.CommandType = CommandType.StoredProcedure;
                objComando.CommandText = "USP_S_BUSCARHORARIO";

                objComando.Parameters.Add(new SqlParameter("@GRADO", SqlDbType.Char));
                objComando.Parameters.Add(new SqlParameter("@ANIO", SqlDbType.VarChar));
                objComando.Parameters.Add(new SqlParameter("@SECCION", SqlDbType.Char));  

                objComando.Parameters["@GRADO"].Value = _grado;
                objComando.Parameters["@ANIO"].Value = _anio;
                objComando.Parameters["@SECCION"].Value = _seccion;

                objComando.Connection = objConexion;
                objComando.ExecuteNonQuery();

                objDataAdapter.SelectCommand = objComando;
                objDataAdapter.Fill(objDataTable);

                return objDataTable;
            }
            catch (SqlException ex)
            {
                return null;
                throw ex;
            }
            finally
            {
                objConexion.Close();
            }
        }

        public DataTable CrearHorario(DataRowCollection registrosHorario)
        {
            List<String> lstNombreCursos = new List<String>(); // Contiente todo los cursos de un horario especifico.
            String n, busqueda;

            try
            {
                // Filtra los nombre de curso para que nose repitan en el Horario.
                for (int i = 0; i < registrosHorario.Count; i++)
                {
                    busqueda = "";
                    n = Convert.ToString(registrosHorario[i]["CUR_Nombre"]);
                    busqueda = lstNombreCursos.Find(delegate(String s) { return s == n; });

                    if (busqueda == null)
                    {
                        lstNombreCursos.Add(n);
                    }
                }

                // Creación de un DataTable que se usara para mostrar el horario
                // Creación de la cabezera
                DataTable dtHorario = new DataTable();
                dtHorario.Columns.Add("CURSO", typeof(String));
                dtHorario.Columns.Add("Lunes", typeof(String));
                dtHorario.Columns.Add("Martes", typeof(String));
                dtHorario.Columns.Add("Miercoles", typeof(String));
                dtHorario.Columns.Add("Jueves", typeof(String));
                dtHorario.Columns.Add("Viernes", typeof(String));
                dtHorario.Columns.Add("Sabado", typeof(String));

                // Agregar los cursos
                for (int i = 0; i < lstNombreCursos.Count; i++)
                {
                    dtHorario.Rows.Add();
                    dtHorario.Rows[i]["CURSO"] = lstNombreCursos[i];
                }

                // Ingresar datos al horario
                foreach (DataRow registro in registrosHorario)
                {
                    for (int i = 0; i < dtHorario.Rows.Count; i++)
                    {                      
                        if ((string)dtHorario.Rows[i]["CURSO"] == (string)registro[5])
                        {
                            foreach (DataColumn dia in dtHorario.Columns)
                            {
                                if ((string)dia.ColumnName == Convert.ToString(registro[3]))
                                {
                                    dtHorario.Rows[i][dia.ColumnName] = registro[1] + "-" + registro[2] + "\n";
                                }
                            }
                        }
                    }
                }

                return dtHorario;
            }
            catch (Exception ex)
            {
                return null;
                throw ex;                
            }
        }        
    }
}
